home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / rjs.lha / RJS / Transport / src / Socket.C < prev    next >
C/C++ Source or Header  |  1991-06-14  |  4KB  |  178 lines

  1. #include <libc.h>
  2. #include <osfcn.h>
  3. #include <iostream.h>
  4. #include <errno.h>
  5.  
  6. #include "Transport.h"
  7. #include <RJS/Util.h>
  8.  
  9. void RJS_Socket::dump()
  10. {
  11. cout << "Socket::dump() { " << endl;
  12. cout << "     Protocol : " << protocol <<endl;
  13. cout << "     Family   : " << family <<endl;
  14. cout << "     Type     : " << type <<endl;
  15. cout << "     td       : " << td << endl;
  16. cout << "}" << endl;
  17.  
  18. }
  19.  
  20. int RJS_Socket::check_syscall(int stat, char *mess)
  21. {
  22.     if (stat==-1) {
  23.         ss_set(RJS_Status(errno)); 
  24.         if (return_on_error) return 0;
  25.         dump();
  26.         RJS_Util::crash_and_burn("Socket",mess,ss_message());
  27.     } else ss_set(SS_success);
  28.     return 1;
  29. }
  30.  
  31. int RJS_Socket::syscall(int stat, char *mess)
  32. {
  33.     if (stat==-1) {
  34.         ss_set(RJS_Status(errno)); 
  35.         if (return_on_error) return stat;
  36.         dump();
  37.         RJS_Util::crash_and_burn("RJS_Socket",mess,ss_message());
  38.     } else ss_set(SS_success);
  39.     return stat;
  40. }
  41.  
  42. RJS_Socket::RJS_Socket(AddressFamily af, SocketType st)
  43. {
  44.   type     = st;    // socket type
  45.   family   = af;    // address family
  46.   protocol = 0;        // protocol
  47.   sex      = Unknown;
  48. }
  49.  
  50.  
  51. RJS_Socket::RJS_Socket(AddressFamily af)    // protected, only used from derived
  52. {                    // class constructor
  53.   family   = af;    // address family
  54.   protocol = 0;        // protocol
  55.   sex      = Unknown;
  56. }
  57.  
  58. RJS_Socket::RJS_Socket(SocketType st)    // protected, only used from derived
  59. {                // class constructor
  60.   type     = st;    // socket type
  61.   protocol = 0;        // protocol
  62.   sex      = Unknown;
  63. }
  64.  
  65. int RJS_Socket::socket()
  66. {
  67.     td = ::socket(address_family(),socket_type(),0);
  68.     return check_syscall(td,"socket");
  69. }
  70.  
  71. int RJS_Socket::accept(struct sockaddr *sa,int &len)
  72. {
  73.     return syscall(::accept(td,sa, &len),"accept");
  74. }
  75.  
  76. int RJS_Socket::bind(const struct sockaddr *sa, int sa_len)
  77. {
  78.     return check_syscall(::bind(td,sa,sa_len),"bind");
  79. }
  80.  
  81. int RJS_Socket::connect(const struct sockaddr *sa, int sa_len)
  82. {
  83.     return check_syscall(::connect(td,sa,sa_len),"connect");
  84. }
  85.  
  86. int RJS_Socket::getpeername(struct sockaddr *sa, int &sa_len)
  87. {
  88.     return check_syscall(::getpeername(td,sa,&sa_len),"getpeername");
  89. }
  90.  
  91. int RJS_Socket::getsockname(struct sockaddr *sa, int &sa_len)
  92. {
  93.     return check_syscall(::getsockname(td,sa,&sa_len),"getsockname");
  94. }
  95.  
  96. int RJS_Socket::recv(char *buffer,int maxbuf,MsgReceiveFlags mrf)
  97. {
  98.     return syscall(::recv(td,buffer,maxbuf,int(mrf)),"recv");
  99. }
  100.  
  101. int RJS_Socket::recvfrom(char *buffer,int maxbuf,struct sockaddr *sa, 
  102.             int &len,MsgReceiveFlags mrf)
  103. {
  104.      return syscall(::recvfrom(td,buffer,maxbuf,int(mrf),sa,&len),"recvfrom");
  105. }
  106.  
  107. int RJS_Socket::recvmsg(struct msghdr *mh,MsgReceiveFlags mrf)
  108. {
  109.     return syscall(::recvmsg(td,mh,int(mrf)),"recvmsg");
  110. }
  111.  
  112. int RJS_Socket::send(const char *buffer,int num,MsgSendFlags msf)
  113. {
  114.     return syscall(::send(td,buffer,num,int(msf)),"send");
  115. }
  116.  
  117.  
  118. int RJS_Socket::sendto(const char *buffer,int num,
  119.         const struct sockaddr *sa, int len,MsgSendFlags msf)
  120. {
  121.     return syscall(::sendto(td,buffer,num,int(msf),sa,len),"sendto");
  122. }
  123.  
  124. int RJS_Socket::sendmsg(struct msghdr *mh,MsgSendFlags msf)
  125. {
  126.     return syscall(::sendmsg(td,mh,int(msf)),"sendmsg");
  127. }
  128.  
  129. int RJS_Socket::listen(int max_conn)
  130. {
  131.     return check_syscall(::listen(td,max_conn),"listen");
  132. }
  133.  
  134.  
  135. RJS_Socket::~RJS_Socket()
  136. {
  137.   if (inuse()) close();
  138. }
  139.  
  140. void RJS_Socket::linger() 
  141. {
  142.   if (!inuse()) return;
  143.   static struct linger ling = {1,10};
  144.   int stat=::setsockopt(td,SOL_SOCKET,SO_LINGER,(const char *)&ling,sizeof(ling));
  145.   if (stat==-1) {
  146.     ss_set(RJS_Status(errno));
  147.     if (return_on_error) return;
  148.     RJS_Util::crash_and_burn("RJS_Socket","linger",ss_message());
  149.   }
  150.   ss_set(SS_success);
  151.   
  152. }
  153.  
  154. int RJS_Socket::setsockopt(SocketLevelOption slo, FlagOption fo)
  155. {
  156.  if (!inuse()) return 0;
  157.  int flag=fo;
  158.   return check_syscall(::setsockopt(td,SOL_SOCKET,int(slo),
  159.             (const char *) &flag,sizeof(flag)),"setsockopt");
  160. }
  161.  
  162. int RJS_Socket::getsockopt(SocketLevelOption slo,FlagOption &fo)
  163. {
  164.   if (!inuse()) return 0;
  165.   int flag; int flagsize=sizeof(flag);
  166.   int stat=check_syscall(::getsockopt(td,SOL_SOCKET,int(slo),
  167.             (char *) &flag,&flagsize),"getsockopt");
  168.   if (flag) fo=On; else fo=Off;
  169.   return stat;
  170.  
  171. }
  172.  
  173. void RJS_Socket::shutdown(ShutDownType sdt)
  174. {
  175.   if (!inuse()) return;
  176.   check_syscall(::shutdown(td,sdt),"shutdown");
  177. }
  178.